home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / gui / prcgntn1.lha / Precognition / source / HScroller.c < prev    next >
C/C++ Source or Header  |  1992-12-23  |  7KB  |  238 lines

  1. /* ==========================================================================
  2. **
  3. **                         HScroller.c
  4. **
  5. ** ⌐1991 WILLISoft
  6. **
  7. ** ==========================================================================
  8. */
  9.  
  10. #include <string.h>
  11. #include "HScroller.h"
  12. #include "minmax.h"
  13. #include "HScrollerClass.h"
  14. #include "EmbossedGadgetClass.h"
  15. #include <proto/exec.h>
  16. #include "amigamem.h"
  17.  
  18.  
  19.  
  20. tPoint HScroller_SetLocation(  HScroller *self,
  21.                                PIXELS     LeftEdge,
  22.                                PIXELS     TopEdge )
  23. {
  24.  
  25.    Point Left_size, Slider_size;
  26.    Point Left_pos,  Right_pos;
  27.  
  28.  
  29.    Left_size   = Size( &self->leftarrow );
  30.    Slider_size = Size( &self->hslider );
  31.  
  32.    SetLocation( &self->hslider, LeftEdge, TopEdge );
  33.  
  34.    Left_pos.x = LeftEdge + Slider_size.x;
  35.    Left_pos.y = TopEdge;
  36.    SetLocation( &self->leftarrow, Left_pos.x, Left_pos.y );
  37.  
  38.    Right_pos.x = Left_pos.x + Left_size.x;
  39.    Right_pos.y = TopEdge;
  40.    SetLocation( &self->rightarrow, Right_pos.x, Right_pos.y );
  41.  
  42.    self->posr.Location.x = LeftEdge;
  43.    self->posr.Location.y = TopEdge;
  44.  
  45.    return Location( self );
  46. }
  47.  
  48.  
  49. tPoint HScroller_private_AskSize(  HScroller *self,
  50.                                    PIXELS     Width,
  51.                                    PIXELS     Height,
  52.                                    Point     *Left_size,
  53.                                    Point     *Right_size,
  54.                                    Point     *Slider_size )
  55. {
  56.    Point size;
  57.  
  58.    *Left_size  = AskSize( &self->leftarrow,  0, 0 );
  59.    *Right_size = AskSize( &self->rightarrow, 0, 0 );
  60.  
  61.    Slider_size->x = Width - (Left_size->x + Right_size->x);
  62.    Slider_size->y = MAX( Left_size->y, Right_size->y );
  63.  
  64.    *Slider_size = AskSize( &self->hslider, Slider_size->x, Slider_size->y );
  65.  
  66.    size.x = Slider_size->x + Left_size->x + Right_size->x;
  67.    size.y = Slider_size->y;
  68.  
  69.    return size;
  70. }
  71.  
  72.  
  73. tPoint HScroller_AskSize(  HScroller *self,
  74.                            PIXELS     Width,
  75.                            PIXELS     Height )
  76. {
  77.    Point Left_size, Right_size, Slider_size, size;
  78.  
  79.    size = HScroller_private_AskSize( self, Width, Height,
  80.             &Left_size, &Right_size, &Slider_size );
  81.  
  82.    return size;
  83. }
  84.  
  85.  
  86. tPoint HScroller_SetSize(  HScroller *self,
  87.                            PIXELS     Width,
  88.                            PIXELS     Height )
  89. {
  90.  
  91.    tPoint Left_size, Right_size, Slider_size, size;
  92.    tPoint pos;
  93.  
  94.    size = HScroller_private_AskSize( self, Width, Height,
  95.             &Left_size, &Right_size, &Slider_size );
  96.  
  97.    SetSize( &self->leftarrow,   Left_size.x,   Left_size.y );
  98.    SetSize( &self->rightarrow, Right_size.x, Right_size.y );
  99.    SetSize( &self->hslider,   Slider_size.x, Slider_size.y );
  100.  
  101.    /* Now must fix the positions of leftarrow, down arrow. */
  102.  
  103.    pos = Location( self );
  104.    SetLocation( self, pos.x, pos.y );
  105.    self->posr.Size = size;
  106.  
  107.    return size;
  108. }
  109.  
  110.  
  111. #ifdef BUILDER
  112. #include "BuilderMethods.h"
  113. #include "GraphicObject_Builder.h"
  114. #include "Positioner_Builder.h"
  115. #include "Positioner_coder.h"
  116.  
  117. struct BuilderMethods HScroller_bm;
  118.  
  119. HScroller *HScroller_New( HScroller *self )
  120. {
  121.    HScroller *new_HScroller = NULL;
  122.  
  123.    if (new_HScroller = (HScroller *) Amalloc(sizeof(HScroller)))
  124.    {
  125.       HScroller_Init( new_HScroller,   self->posr.Location.x, self->posr.Location.y,
  126.                       self->posr.Size.x,  self->Pens,
  127.                       Title(self) );
  128.       GiveItAName( new_HScroller );
  129.    }
  130.    return new_HScroller;
  131. }
  132.  
  133. #endif
  134.  
  135.  
  136. BOOL HScroller_elaborated = FALSE;
  137.  
  138. struct PositionerClass HScroller_Class;
  139.  
  140. #include "VScrollerClass.h"
  141.  
  142. void HScrollerClass_Init( struct PositionerClass *class )
  143. {
  144.    PositionerClass_Init( class );
  145.    class->isa                 = PositionerClass();
  146.    class->ClassName           = "HScroller";
  147.    class->CleanUp             = VScroller_CleanUp;
  148.    class->SetLocation         = HScroller_SetLocation;
  149.    class->AskSize             = HScroller_AskSize;
  150.    class->SetSize             = HScroller_SetSize;
  151.    class->SizeFlags           = GraphicObject_SizeFlagsX;
  152.    class->Render              = VScroller_Render;
  153.    class->SetInteractorWindow  = VScroller_SetInteractorWindow;
  154.    class->FirstGadget         = VScroller_FirstGadget;
  155.    class->nGadgets            = VScroller_nGadgets;
  156.    class->IDCMPFlags          = VScroller_IDCMPFlags;
  157.    class->ClaimEvent          = VScroller_ClaimEvent;
  158.    class->Respond             = VScroller_Respond;
  159.    class->Refresh             = VScroller_Refresh;
  160.    class->EnableIactor              = VScroller_EnableIactor;
  161.    class->isEnabled           = EmbossedGadget_isEnabled;
  162.    class->Activate            = NULL;
  163.    class->isActive            = NULL;
  164.    class->SetKnobSize         = VScroller_SetKnobSize;
  165.    class->SetValue            = VScroller_SetValue;
  166.    class->KnobSize            = VScroller_KnobSize;
  167.    class->Value               = VScroller_Value;
  168.    class->Title               = VScroller_Title;
  169.    class->TextAlignment       = VScroller_TextAlignment;
  170.    class->SetTitle            = VScroller_SetTitle;
  171.    class->SetTextAlignment    = VScroller_SetTextAlignment;
  172. #ifdef BUILDER
  173.    go_InitBuilderMethods( &HScroller_bm );
  174.    HScroller_bm.New       = HScroller_New;
  175.    HScroller_bm.PropEdit  = Positioner_PropEdit;
  176.    HScroller_bm.WriteCode = Positioner_WriteCode;
  177.    class->BuilderMethods  = &HScroller_bm;
  178. #endif
  179.  
  180. }
  181.  
  182.  
  183. struct PositionerClass *HScrollerClass( void )
  184. {
  185.    if (! HScroller_elaborated)
  186.    {
  187.       HScrollerClass_Init( &HScroller_Class );
  188.       HScroller_elaborated = TRUE;
  189.    }
  190.  
  191.    return &HScroller_Class;
  192. }
  193.  
  194.  
  195.  
  196.  
  197. void HScroller_Init( HScroller  *self,
  198.                      PIXELS      LeftEdge,
  199.                      PIXELS      TopEdge,
  200.                      PIXELS      Width,
  201.                      pcg_3DPens  Pens,
  202.                      char       *label )
  203. {
  204.    Gadget *g;
  205.  
  206.    Positioner_Init(self);
  207.    
  208.    self->posr.isa           = HScrollerClass();
  209.    self->posr.Location.x    = LeftEdge;
  210.    self->posr.Location.y    = TopEdge;
  211.    self->Pens               = Pens;
  212.  
  213.    /*
  214.    ** Initialize objects with dumb values, just so that they are now
  215.    ** proper objects.
  216.    */
  217.  
  218.    ArrowGadget_Init( &self->leftarrow,   LeftEdge, TopEdge,
  219.       LeftArrow, Pens );
  220.    ArrowGadget_Init( &self->rightarrow, LeftEdge, TopEdge,
  221.       RightArrow, Pens );
  222.    HSlider_Init( &self->hslider,       LeftEdge, TopEdge, 0, 0, Pens, NULL );
  223.    self->hslider.eg.Next = &self->leftarrow;
  224.    self->leftarrow.Next    = &self->rightarrow;
  225.  
  226.    SetSize( self, Width, 0 );
  227.  
  228.    /* Chain the gadgets together. */
  229.    g = FirstGadget( self );
  230.    ChainGadgets( g,  FirstGadget( &self->leftarrow ) );
  231.    ChainGadgets( g,  FirstGadget( &self->rightarrow ) );
  232.  
  233.    SetTitle( self, label );
  234.    SetTextAlignment( self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
  235.       STD_XPAD, STD_YPAD );
  236.  
  237. }
  238.